function lengthOfLongestSubstring(s) {
  const map = new Map(); // 存储字符及其最近出现的位置
  let maxLength = 0;
  let left = 0; // 滑动窗口左边界

  for (let right = 0; right < s.length; right++) {
    const currentChar = s[right];
    // 如果字符已存在且在当前窗口内，则移动左指针
    if (map.has(currentChar) && map.get(currentChar) >= left) {
      left = map.get(currentChar) + 1;
    }
    // 更新当前字符的位置
    map.set(currentChar, right);
    // 计算当前窗口长度并更新最大值
    maxLength = Math.max(maxLength, right - left + 1);
  }

  return maxLength;
}
